#include "cxicolorpicker_p.h"
static const int COLOR_PICKER_WIDTH = 24;// 颜色块预览宽度
CxiColorPickerPrivate::CxiColorPickerPrivate(CxiColorPicker* p)
	: QObject(p),
	  q_ptr(p),
	  m_mainLayout(nullptr),
	  m_colorLabel(nullptr),
	  m_colorText(nullptr),
	  m_dropLabel(nullptr),
	  m_displayType(CxiColorPicker::DisplayType::RGB),
	  m_currentColor(Qt::white),// 默认颜色：白色
	  m_colordialog(nullptr)
{
}
CxiColorPickerPrivate::~CxiColorPickerPrivate() = default;
void CxiColorPickerPrivate::init()
{
	Q_Q(CxiColorPicker);
	//初始化控件
	initControls();
	connect(m_colordialog, &QColorDialog::colorSelected,
			this, &CxiColorPickerPrivate::onColorSelected);
}
void CxiColorPickerPrivate::initControls()
{
	Q_Q(CxiColorPicker);
	m_mainLayout = new QHBoxLayout(q);
	m_mainLayout->setSpacing(0);                 // 消除间距，实现边框无缝衔接
	m_mainLayout->setContentsMargins(0, 0, 0, 0);// 去除外边框间距

	// 左侧：颜色预览label（固定宽度24Hpx）
	m_colorLabel = new QLabel(q);
	m_colorLabel->setFixedWidth(COLOR_PICKER_WIDTH);                        // 固定宽度
	m_colorLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);// 高度随布局自适应
	m_colorLabel->setMinimumHeight(COLOR_PICKER_WIDTH);                     // 最小高度，确保正方形比例
	updateColorLabel(m_currentColor);
	m_colorLabel->setFrameShape(QFrame::Panel);// 边框形状：面板式（矩形实心边框）
	m_colorLabel->setLineWidth(1);

	// 中间：颜色文本（自适应宽度）
	m_colorText = new QLabel(q);
	m_colorText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);// 宽度拉伸，高度自适应
	m_colorText->setMinimumHeight(COLOR_PICKER_WIDTH);                         // 与左右保持一致高度
	// 使用QPalette设置背景色
	QPalette textPalette = m_colorText->palette();
	textPalette.setColor(QPalette::Window, Qt::white);
	m_colorText->setPalette(textPalette);
	m_colorText->setAutoFillBackground(true);
	m_colorText->setFrameShape(QFrame::Panel);// 边框形状：面板式（矩形实心边框）
	m_colorText->setLineWidth(1);

	updateColorText(m_currentColor);

	// 右侧：下拉图标label
	m_dropLabel = new QLabel(q);
	m_dropLabel->setFixedWidth(COLOR_PICKER_WIDTH);                        // 固定宽度，与左侧保持对称
	m_dropLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Preferred);// 高度随布局自适应
	m_dropLabel->setMinimumHeight(COLOR_PICKER_WIDTH);                     // 确保高度一致
	// 使用QPalette设置背景色
	QPalette dropPalette = m_dropLabel->palette();
	dropPalette.setColor(QPalette::Window, Qt::white);
	m_dropLabel->setPalette(dropPalette);
	m_dropLabel->setAutoFillBackground(true);
	m_dropLabel->setFrameShape(QFrame::Panel);// 边框形状：面板式（矩形实心边框）
	m_dropLabel->setLineWidth(1);

	m_dropLabel->setAlignment(Qt::AlignCenter);// 图标居中

	// 设置下拉箭头图标（适配当前风格，尺寸适中）
	m_dropLabel->setPixmap(QPixmap(":/icon/cmb.png"));

	m_mainLayout->addWidget(m_colorLabel);  // 左侧：颜色预览
	m_mainLayout->addWidget(m_colorText, 1);// 中间：文本框（占1份拉伸权重，填满剩余空间）
	m_mainLayout->addWidget(m_dropLabel);

	m_colordialog = new QColorDialog(q);           // 父对象设为q，确保对话框随控件销毁
	m_colordialog->setCurrentColor(m_currentColor);// 对话框默认选中当前颜色
	m_colordialog->setWindowTitle("选择颜色");     // 对话框标题
}
void CxiColorPickerPrivate::updateColorText(QColor color)
{
	if (m_displayType == CxiColorPicker::DisplayType::RGB)
	{
		// 提取颜色的红、绿、蓝分量
		int red = color.red();
		int green = color.green();
		int blue = color.blue();
		// 拼接成“R, G, B”格式的字符串并设置到文本标签
		m_colorText->setText(QString("%1, %2, %3").arg(red).arg(green).arg(blue));
		return;
	}
	else
	{
		m_colorText->setText(color.name());
	}
}
// 辅助：更新颜色预览块的背景色
void CxiColorPickerPrivate::updateColorLabel(const QColor& color)
{
	// 使用QPalette设置背景色
	QPalette palette = m_colorLabel->palette();
	// 将窗口背景色设置为目标颜色
	palette.setColor(QPalette::Window, color);
	m_colorLabel->setPalette(palette);
	// 启用自动填充背景
	m_colorLabel->setAutoFillBackground(true);
}
//void CxiColorPickerPrivate::updateColorLabel(const QColor& color)
//{
//	m_colorLabel->setStyleSheet(QString("background-color: %1;").arg(color.name()));
//}
void CxiColorPickerPrivate::onColorSelected(const QColor& color)
{
	if (!color.isValid()) return;// 过滤无效颜色（如用户取消选择）
	// 更新当前颜色和控件显示
	m_currentColor = color;
	updateColorLabel(color);
	updateColorText(color);
}
void CxiColorPickerPrivate::showColorDialog()
{
	if (!m_colordialog) return;
	// 设置弹窗位置：控件正下方（避免被窗口边缘截断）
	QPoint dialogPos = q_ptr->mapToGlobal(QPoint(0, q_ptr->height()));
	m_colordialog->move(dialogPos);
	m_colordialog->show();
}
void CxiColorPickerPrivate::setColorFromRgb(int r, int g, int b)
{
	// 校验RGB值范围（0-255），超出范围则截断到有效区间
	r = qBound(0, r, 255);// 小于0则取0，大于255则取255
	g = qBound(0, g, 255);
	b = qBound(0, b, 255);

	// 构造QColor并更新显示
	QColor color(r, g, b);

	m_currentColor = color;
	updateColorLabel(color);// 更新颜色块
	updateColorText(color); // 更新文本（根据当前显示类型）
}
bool CxiColorPickerPrivate::setColorFromString(QString color)
{
	QColor newColor;

	// 处理RGB格式（逗号分隔）
	if (color.contains(","))
	{
		QStringList rgbParts = color.split(",");
		// 必须包含3个分量
		if (rgbParts.size() == 3)
		{
			bool valid = true;
			int r = rgbParts[0].trimmed().toInt(&valid);
			if (!valid || r < 0 || r > 255) return false;

			int g = rgbParts[1].trimmed().toInt(&valid);
			if (!valid || g < 0 || g > 255) return false;

			int b = rgbParts[2].trimmed().toInt(&valid);
			if (!valid || b < 0 || b > 255) return false;

			newColor = QColor(r, g, b);
		}
		else
		{
			return false;// 格式错误
		}
	}
	// 处理十六进制格式
	else
	{
		newColor = QColor(color);
		if (!newColor.isValid()) return false;// 无效颜色
	}

	// 解析成功，更新颜色
	m_currentColor = newColor;
	updateColorLabel(newColor);
	updateColorText(newColor);
	return true;
}
